package cn.com.dstz.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import cn.com.dstz.web.constants.Constants;

/**
 * 验证码Servlet
 * 
 * @author 叶装装
 * 
 */
public class SeccodeServlet extends HttpServlet{

	private static final long serialVersionUID = -205545450335033053L;

	@Override
	public void destroy( ) {
		super.destroy( );
	}

	@Override
	public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
		getImage( request, response );
	}

	@Override
	public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
		doGet( request, response );
	}

	@Override
	public void init( ) throws ServletException {
	}

	public void getImage( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {

		int width = 80;
		int height = 30;

		int fontSize = 18;
		int wordPlace = ( height / 2 + fontSize / 3 );
		BufferedImage image = new BufferedImage( width, height, BufferedImage.TYPE_INT_RGB );
		Graphics g = image.getGraphics( );

		Random random = new Random( );

		g.fillRect( 0, 0, width, height );
		g.setFont( new Font( "宋体", Font.PLAIN, fontSize ) );

		g.setColor( getRandColor( 160, 200 ) );

		for ( int i = 0; i < 20; i++ ){
			int x = random.nextInt( width );
			int y = random.nextInt( height );
			int xl = random.nextInt( width );
			int yl = random.nextInt( height );
			g.drawLine( x, y, xl, yl );
		}
		String str = "ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
		String sRand = "";
		for ( int i = 0; i < 4; i++ ){
			String rand = String.valueOf( str.charAt( random.nextInt( 62 ) ) );
			sRand += rand;
			g.setColor( new Color( 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 ) ) );
			g.drawString( rand, fontSize * i + fontSize / 4, wordPlace );
		}
		g.dispose( );

		boolean write = ImageIO.write( image, "JPEG", response.getOutputStream( ) );
		if( write ){
			setSessionAttr( request, sRand );
		}
		image = null;
	}
	
	private void setSessionAttr( HttpServletRequest request, String value ){
		HttpSession session = request.getSession( false );
		if( session == null ){
			session = request.getSession( );
		}
		
		session.setAttribute( Constants.VERIFY_CODE_IN_SESSION, value );
	}

	private Color getRandColor( int fc, int bc ) {
		Random random = new Random( );
		if( fc > 255 ){
			fc = 255;
		}
		if( bc > 255 ){
			bc = 255;
		}
		int r = fc + random.nextInt( bc - fc );
		int g = fc + random.nextInt( bc - fc );
		int b = fc + random.nextInt( bc - fc );
		return new Color( r, g, b );
	}
}
